package org.zero.concurrency.demo.example.singleton;

import org.zero.concurrency.demo.annotations.ThreadSafe;

/**
 * 双重同步锁+volatile实现的懒汉式单例-线程安全
 * 实例在第一次使用的时候创建
 *
 * @author 01
 */
@ThreadSafe
public class SingletonExample6 {

    /**
     * 单例对象，使用 volatile 防止指令重排
     */
    private volatile static SingletonExample6 instance = null;

    /**
     * 私有构造函数
     */
    private SingletonExample6() {
    }

    /**
     * 静态工厂方法-获取实例
     *
     * @return instance
     */
    public static SingletonExample6 getInstance() {
        // 双重检查机制
        if (instance == null) {
            // 同步锁
            synchronized (SingletonExample6.class) {
                if (instance == null) {
                    instance = new SingletonExample6();
                }
            }
        }
        return instance;
    }
}
